
/*
 * 文件名：ExcelUtils.java.
 * 描述：
 * 创建人: 龚洪亮
 * 创建时间：2017年8月29日
 */

package com.fiberhome.platform.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import com.fiberhome.platform.entity.MapOutputInfo;


/**
 * @Description 导出Excel文档工具类
 * @author 龚洪亮
 * @version 2017年8月29日
 */
public class ExcelUtil {

    /**
     * 创建excel文档，
     * @param list 数据
     * @param keys list中map的key数组集合
     * @param columnNames excel的列名
     * */
    public static Workbook createWorkBook(List<Map<String, Object>> list,String []keys,String columnNames[]) {
        // 创建excel工作簿
        Workbook wb = new HSSFWorkbook();
        // 创建第一个sheet（页），并命名
        Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
        // 手动设置列宽。第一个参数表示要为第几列设；，第二个参数表示列的宽度，n为列高的像素数。
        for(int i=0;i<keys.length;i++){
            sheet.setColumnWidth((short) i, (short) (35.7 * 150));
        }

        // 创建第一行
        Row row = sheet.createRow((short) 0);

        // 创建两种单元格格式
        CellStyle cs = wb.createCellStyle();
        CellStyle cs2 = wb.createCellStyle();

        // 创建两种字体
        Font f = wb.createFont();
        Font f2 = wb.createFont();

        // 创建第一种字体样式（用于列名）
        f.setFontHeightInPoints((short) 10);
        f.setColor(IndexedColors.BLACK.getIndex());
        f.setBoldweight(Font.BOLDWEIGHT_BOLD);

        // 创建第二种字体样式（用于值）
        f2.setFontHeightInPoints((short) 10);
        f2.setColor(IndexedColors.BLACK.getIndex());


        cs.setFont(f);
        cs.setBorderLeft(CellStyle.BORDER_THIN);
        cs.setBorderRight(CellStyle.BORDER_THIN);
        cs.setBorderTop(CellStyle.BORDER_THIN);
        cs.setBorderBottom(CellStyle.BORDER_THIN);
        cs.setAlignment(CellStyle.ALIGN_CENTER);

        // 设置第二种单元格的样式（用于值）
        cs2.setFont(f2);
        cs2.setBorderLeft(CellStyle.BORDER_THIN);
        cs2.setBorderRight(CellStyle.BORDER_THIN);
        cs2.setBorderTop(CellStyle.BORDER_THIN);
        cs2.setBorderBottom(CellStyle.BORDER_THIN);
        cs2.setAlignment(CellStyle.ALIGN_CENTER);
        //设置列名
        for(int i=0;i<columnNames.length;i++){
            Cell cell = row.createCell(i);
            cell.setCellValue(columnNames[i]);
            cell.setCellStyle(cs);
        }
        //设置每行每列的值
        for (short i = 1; i < list.size(); i++) {
            // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
            // 创建一行，在页sheet上
            Row row1 = sheet.createRow((short) i);
            // 在row行上创建一个方格
            for(short j=0;j<keys.length;j++){
                Cell cell = row1.createCell(j);
                cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
                cell.setCellStyle(cs2);
            }
        }
        return wb;
    }

    
    /** 
     * 描述：根据文件路径获取项目中的文件 
     * @param fileDir 文件路径 
     * @return 
     * @throws Exception 
     */  
    public File getExcelDemoFile(String fileDir) throws Exception{  
        String classDir = null;  
        String fileBaseDir = null;  
        File file = null;  
        classDir = Thread.currentThread().getContextClassLoader().getResource("/").getPath();  
        fileBaseDir = classDir.substring(0, classDir.lastIndexOf("classes"));  
          
        file = new File(fileBaseDir+fileDir);  
        if(!file.exists()){  
            throw new Exception("模板文件不存在！");  
        }  
        return file;  
    }  
      
    public  Workbook writeNewExcel(File file,String sheetName,List<MapOutputInfo> lis) throws Exception{  
        Workbook wb = null;  
        Row row = null;   
        Cell cell = null;  
          
        FileInputStream fis = new FileInputStream(file);  
        wb = getWorkbook(fis, file.getName());    //获取工作薄  
        Sheet sheet = wb.getSheet(sheetName);
        //循环插入数据  
        int lastRow = sheet.getLastRowNum()+1;    //插入数据的数据ROW  
        CellStyle cs = setSimpleCellStyle(wb);    //Excel单元格样式  
        for (int i = 0; i < lis.size(); i++) {  
            row = sheet.createRow(lastRow+i); //创建新的ROW，用于数据插入  
              
            //按项目实际需求，在该处将对象数据插入到Excel中  
            MapOutputInfo mo  = lis.get(i);  
            if(null==mo){  
                break;  
            }  
            //Cell赋值开始  
            cell = row.createCell(0);  
            cell.setCellValue(mo.getId());  
            cell.setCellStyle(cs);  
            
            cell = row.createCell(1);  
            cell.setCellValue(mo.getNeedNo());  
            cell.setCellStyle(cs);  
              
            cell = row.createCell(2);  
            cell.setCellValue(mo.getNeedName());  
            cell.setCellStyle(cs);  
              
            cell = row.createCell(3);  
            cell.setCellValue(mo.getTestNo());  
            cell.setCellStyle(cs);
            
            cell = row.createCell(4);  
            cell.setCellValue(mo.getCatList().get(0).getName());  
            cell.setCellStyle(cs);
            
            if (mo.getCatList().size()==3) {
            	cell = row.createCell(5);  
            	cell.setCellValue(mo.getCatList().get(1).getName());  
            	cell.setCellStyle(cs);
			}
            
            if (mo.getCatList().size()==4) {
            	cell = row.createCell(5);  
            	cell.setCellValue(mo.getCatList().get(1).getName());  
            	cell.setCellStyle(cs);
            	
            	cell = row.createCell(6);  
                cell.setCellValue(mo.getCatList().get(2).getName());  
                cell.setCellStyle(cs);
			}
            
            if (mo.getCatList().size()==5) {
            	cell = row.createCell(5);  
            	cell.setCellValue(mo.getCatList().get(1).getName());  
            	cell.setCellStyle(cs);
            	
            	cell = row.createCell(6);  
                cell.setCellValue(mo.getCatList().get(2).getName());  
                cell.setCellStyle(cs);
            	
            	cell = row.createCell(7);  
                cell.setCellValue(mo.getCatList().get(3).getName());  
                cell.setCellStyle(cs);
			}
            
            
            cell = row.createCell(8);  
            cell.setCellValue(mo.getItem());  
            cell.setCellStyle(cs);
        }  
        return wb;  
    }  
    
    /**
	 * @Description 
	 * @Date 2017年8月29日
	 * @param fis
	 * @param name
	 * @return
	 */
	private Workbook getWorkbook(FileInputStream fis, String name) {
		try {
			Workbook workbook = new HSSFWorkbook(fis);
			return workbook;
		} catch (IOException e) {
			System.out.println("模板未找到！");
			e.printStackTrace();
		}
		return null;
	}


	/** 
     * 描述：设置简单的Cell样式 
     * @return 
     */  
    public  CellStyle setSimpleCellStyle(Workbook wb){  
        CellStyle cs = wb.createCellStyle();  
          
        cs.setBorderBottom(CellStyle.BORDER_THIN); //下边框  
        cs.setBorderLeft(CellStyle.BORDER_THIN);//左边框  
        cs.setBorderTop(CellStyle.BORDER_THIN);//上边框  
        cs.setBorderRight(CellStyle.BORDER_THIN);//右边框  
        cs.setAlignment(CellStyle.ALIGN_CENTER); // 居中  
          
        return cs;  
    }  
}
